package com.zyl.Ecs.common.response;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
import org.springframework.util.StringUtils;

import java.util.function.Function;

/**
 * @version v1.0
 * @ProjectName: Ecs
 * @Package: com.zyl.Ecs.common.response
 * @ClassName: Result
 * @Description TODO (通用响应实体)
 * @Author 翟玉龙
 * @Date 2024/12/4-11:23
 */
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Result<T> {

    private Integer code; // 定义返回状态码

    private String message; // 定义返回消息

    private T data; // 定义返回数据,泛型

    /**
     * 无数据返回
     * @return Result
     * @param <T> Result type
     */
    public static <T> Result <T> success() {
        return new Result<>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), null);
    }

    /**
     * 成功返回构造
     * @param data 返回数据
     * @return  Result
     * @param <T>  泛型
     */
    public static <T> Function<String, Result<T>> success(T data) {
        return (msg) ->
                new Result<>(ResultCode.SUCCESS.getCode(), StringUtils.hasText(msg) ? msg : "success", data);
    }

    /**
     * 成功返回构造
     * @param message 返回消息
     * @param data 返回数据
     * @return Result
     * @param <T> 泛型
     */
    public static <T> Result <T> success(String message , T data) {
        return new Result<>(ResultCode.SUCCESS.getCode(), message , data);
    }

    /**
     * 成功返回构造
     * @param e 通用枚举
     * @param data 返回数据
     * @return Result
     * @param <T> 泛型
     */
    public static <T> Result <T> success(ResultCode e , T data) {
        return new Result<>(e.getCode(), e.getMessage() , data);
    }

    /**
     * 成功返回构造
     * @param e 针对枚举
     * @param data 返回数据
     * @return Result
     * @param <T> 泛型
     */
    public static <T> Result <T> success(CodeEnums e , T data) {
        return new Result<>(e.getCode(), e.getMsg() , data);
    }

    /**
     * 成功返回构造
     * @param e 通用枚举
     * @return 空数据返回
     */
    public static Result <String> success(ResultCode e ) {
        return new Result<>(e.getCode(), e.getMessage() , "");
    }

    /**
     * 成功返回构造
     * @param e 针对枚举
     * @return 空数据返回
     */
    public static Result <String> success(CodeEnums e) {
        return new Result<>(e.getCode(), e.getMsg() , "");
    }

    /**
     * 失败构造返回
     * @return Result
     */
    public static Result<?> error() {
        return new Result<>(ResultCode.FAILURE.getCode(), ResultCode.FAILURE.getMessage(), null);
    }

    /**
     * 失败构造返回
     * @param message 返回消息
     * @return Result
     */
    public static Result <String> error(String message) {
        return new Result<>(ResultCode.FAILURE.getCode(), message , "");
    }

    /**
     * 失败构造返回
     * @param message 返回消息
     * @return Result
     */
    public static <T> Result <T> error(String message , T data) {
        return new Result<>(ResultCode.FAILURE.getCode(), message , data);
    }

    /**
     * 失败构造返回
     * @param code 响应码
     * @param message 返回消息
     * @return Result
     */
    public static Result <String> error(Integer code , String message) {
        return new Result<>(code , message , "");
    }

    /**
     * 失败构造返回
     * @param code 针对枚举类
     * @return Result
     */
    public static Result <String> error(CodeEnums code) {
        return new Result<>(code.getCode() , code.getMsg() , "");
    }

    /**
     * 失败构造返回
     * @param code 通用枚举类
     * @return Result
     */
    public static Result <String> error(ResultCode code) {
        return new Result<>(code.getCode() , code.getMessage() , "");
    }

    /**
     * 失败构造返回
     * @param code 通用枚举类
     * @return Result
     */
    public static <T> Result <T> error(ResultCode code, T data) {
        return new Result<>(code.getCode() , code.getMessage() , data);
    }

    /**
     * 失败构造返回
     * @param code 针对枚举类
     * @return Result
     */
    public static <T> Result <T> error(CodeEnums code, T data) {
        return new Result<>(code.getCode() , code.getMsg() , data);
    }

}
